home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / fs201q0 / fs201q0.c < prev    next >
Text File  |  1993-07-08  |  30KB  |  1,397 lines

  1. /* FMSC-201G -> Q0     Driver      Copyright (c)     E.Suto , 1992,1993       */
  2. /*     修正履歴 Ver 0.00    1992/03/09    jx100q0 V1.50より試作版           */
  3. /*          Ver 0.01    1992/04/17    統合化                           */
  4. /*          Ver 0.01+    1992/04/24    高速テスト版                   */
  5. /*          Ver 0.01x    1992/05/03    高速決定版                       */
  6. /*          Ver 0.01y    1992/05/07    3回00(^^;他                   */
  7. /*          Ver 0.01z    1992/07/03    後悔版(^^;他                   */
  8. /*          Ver 0.02a    1992/12/02    高速化(^^;他                   */
  9. /*              Ver 0.11     1993/01/18    それなり修正(^^;               */
  10. /*              Ver 0.12     1993/02/22    自動で外部RS232C使用       */
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include "register.h"
  15.  
  16. #define STX        0x02
  17. #define CAN        0x18
  18. #define ACK        0x06
  19. #define NACK    0x15
  20. #define ESC        0x1B
  21. #define NULL_    0x00
  22.  
  23. void cancel() ;
  24. void copyright();
  25. void cur_off() ;
  26. void cur_on() ;
  27. void fal_make() ;
  28. void free_buff() ;
  29. void get_buff() ;
  30. void int_read() ;
  31. void int_set() ;
  32. void in_check() ;
  33. void make_q0() ;
  34. void modem_set() ;
  35. void modem_reset() ;
  36. void parm_set() ;
  37. void pcheck() ;
  38. void pre_in() ;
  39. void pre_in2() ;
  40. void read_back() ;
  41. void read_plain(unsigned char *) ;
  42. void rotation() ;
  43. void rs232c_send(unsigned char) ;
  44. void rs232c_receive(unsigned char *) ;
  45. void rs232c_reset() ;
  46. void rs232c_set(unsigned char) ;
  47. void scan_init() ;
  48. void send(int) ;
  49. void usage() ;
  50. void wait_ack() ;
  51. int in_list() ;
  52. int max_(int,int) ;
  53. int pcheck_x() ;
  54. int pcheck_y() ;
  55.  
  56. static short              res_x       = 100  ;/* 主走査線方向の解像度     */
  57. static short              res_y       = 100  ;/* 副走査線方向の解像度     */
  58. static short              zoom_x   = 100  ;/* 主走査線方向のズーム値 */
  59. static short              zoom_y   = 100  ;/* 副走査線方向のズーム値 */
  60. static short              start_x  =   0  ;/* 主走査線方向の始点     */
  61. static short              start_y  =   0  ;/* 副走査線方向の始点     */
  62. static short              length_x = 400  ;/* 主走査線方向の長さ     */
  63. static short              length_y = 640  ;/* 副走査線方向の長さ     */
  64. static short              bright   =   0  ;/* 明度指定                 */
  65. static short              gamma       =   1  ;/* 濃度補正                 */
  66. static short              rotat       =   0  ;/* 画像回転処理             */
  67. static short              fal       =   1  ;/* FAL作成             */
  68. static short              debug       =   0  ;/* 詳細情報表示             */
  69.  
  70. static unsigned char cmd[16] ;
  71. static unsigned char *buffer ;
  72. static unsigned char *br,*bg,*bb ;
  73. static unsigned char name_q0[128],name_fal[128] ;
  74. static unsigned char modem_select ;
  75.  
  76. static struct _rs232c_parm {
  77.     unsigned char    mode ;
  78.     unsigned char    rate ;
  79.     unsigned short    data_addr_o ;
  80.     unsigned short    data_addr_s ;
  81.     unsigned short    send_timeout ;
  82.     unsigned short    recive_timeout ;
  83.     unsigned long    reserve0 ;
  84.     unsigned char    reserve1 ;
  85.     unsigned char    reserve2 ;
  86.     unsigned char    reserve3 ;
  87. } rs232c_parm ;
  88.  
  89. static struct _data_parm {
  90.     unsigned short    length ;
  91.     unsigned short    counter ;
  92.     unsigned short    in ;
  93.     unsigned short    out ;
  94.     unsigned char    data[2048] ;
  95. } data_parm ;
  96.  
  97. static unsigned int int_data ;
  98.  
  99. /* メイン */
  100. main(int argc,char *argv[])
  101. {
  102.     int i,k ;
  103.     char *c ;
  104.     unsigned char *p1 ;
  105.  
  106.     strcpy( name_q0 , "" );
  107.  
  108. /* オプションのチェック */
  109.     if( argc < 2 ) {
  110.         pre_in() ;
  111.     }
  112.     else {
  113.         k = 0 ;
  114.         for( i=1 ; i<argc ; i++ ) {
  115.             c = argv[i] ;
  116.             if( *c == '-' || *c == '/' ) {
  117.                 switch( *++c ) {
  118.                 case 'r' :
  119.                 case 'R' :
  120.                     switch( *++c ) {
  121.                     case 'o' :
  122.                     case 'O' :
  123.                         c++ ;
  124.                         if( sscanf( c , "%d" , &rotat ) == EOF ||
  125.                                 ( rotat != 0 &&
  126.                                 rotat != 1 &&
  127.                                 rotat != 2 &&
  128.                                 rotat != 3 ) )
  129.                             goto perr ;
  130.                         break ;
  131.                     case 'x' :
  132.                     case 'X' :
  133.                         c++ ;
  134.                         if( sscanf( c , "%d" , &res_x ) == EOF ||
  135.                                 res_x < 50 ||
  136.                                 res_x > 200 )
  137.                             goto perr ;
  138.                         break ;
  139.                     case 'y' :
  140.                     case 'Y' :
  141.                         c++ ;
  142.                         if( sscanf( c , "%d" , &res_y ) == EOF ||
  143.                                 res_y < 50 ||
  144.                                 res_y > 200 )
  145.                             goto perr ;
  146.                         break ;
  147.                     default :
  148.                         goto perr ;
  149.                     }
  150.                     break ;
  151.                 case 'z' :
  152.                 case 'Z' :
  153.                     switch( *++c ) {
  154.                     case 'x' :
  155.                     case 'X' :
  156.                         c++ ;
  157.                         if( sscanf( c , "%d" , &zoom_x ) == EOF ||
  158.                                 zoom_x <  50 ||
  159.                                 zoom_x > 200 )
  160.                             goto perr ;
  161.                         break ;
  162.                     case 'y' :
  163.                     case 'Y' :
  164.                         c++ ;
  165.                         if( sscanf( c , "%d" , &zoom_y ) == EOF ||
  166.                                 zoom_y <  50 ||
  167.                                 zoom_y > 200 )
  168.                             goto perr ;
  169.                         break ;
  170.                     default :
  171.                         goto perr ;
  172.                     }
  173.                     break ;
  174.                 case 's' :
  175.                 case 'S' :
  176.                     switch( *++c ) {
  177.                     case 'x' :
  178.                     case 'X' :
  179.                         c++ ;
  180.                         if( sscanf( c , "%d" , &start_x ) == EOF ||
  181.                                 start_x <    0 ||
  182.                                 start_x > 1592 )
  183.                             goto perr ;
  184.                         break ;
  185.                     case 'y' :
  186.                     case 'Y' :
  187.                         c++ ;
  188.                         if( sscanf( c , "%d" , &start_y ) == EOF ||
  189.                                 start_y <     0 ||
  190.                                 start_y > 2559 )
  191.                             goto perr ;
  192.                         break ;
  193.                     default :
  194.                         goto perr ;
  195.                     }
  196.                     break ;
  197.                 case 'l' :
  198.                 case 'L' :
  199.                     switch( *++c ) {
  200.                     case 'x' :
  201.                     case 'X' :
  202.                         c++ ;
  203.                         if( sscanf( c , "%d" , &length_x ) == EOF ||
  204.                                 length_x <     8 ||
  205.                                 length_x > 800 ||
  206.                                 length_x % 8 != 0 )
  207.                             goto perr ;
  208.                         break ;
  209.                     case 'y' :
  210.                     case 'Y' :
  211.                         c++ ;
  212.                         if( sscanf( c , "%d" , &length_y ) == EOF ||
  213.                                 length_y <      1 ||
  214.                                 length_y > 1280 )
  215.                             goto perr ;
  216.                         break ;
  217.                     default :
  218.                         goto perr ;
  219.                     }
  220.                     break ;
  221.                 case 'b' :
  222.                 case 'B' :
  223.                     c++ ;
  224.                     if( sscanf( c , "%d" , &bright ) == EOF ||
  225.                             bright < -3 ||
  226.                             (bright > 3 && bright < 253 ) ||
  227.                             bright > 255 )
  228.                         goto perr ;
  229.                     break ;
  230.                 case 'g' :
  231.                 case 'G' :
  232.                     c++ ;
  233.                     if( sscanf( c , "%d" , &gamma ) == EOF ||
  234.                             ( gamma !=    1 &&
  235.                             gamma !=  2 &&
  236.                             gamma !=  0 &&
  237.                             gamma != 16 &&
  238.                             gamma != 32 ) )
  239.                         goto perr ;
  240.                     break ;
  241.                 case 'f' :
  242.                 case 'F' :
  243.                     c++ ;
  244.                     if( sscanf( c , "%d" , &fal ) == EOF ||
  245.                             ( fal !=  1 &&
  246.                             fal !=    0 ) )
  247.                         goto perr ;
  248.                     break ;
  249.                 case 'i' :
  250.                 case 'I' :
  251.                     debug = -1 ;
  252.                     break ;
  253.                 case 'h' :
  254.                 case 'H' :
  255.                     copyright() ;
  256.                     usage() ;
  257.                     exit( 0 ) ;
  258.                     break ;
  259.                 default :
  260.                     goto perr ;
  261.                 }
  262.             }
  263.             else {
  264.                 if( k ) {
  265. perr:      printf( "パラメタ(%s)の指定が間違っています。\n" , argv[i] ) ;
  266.                     exit( -1 ) ;
  267.                 }
  268.                 strcpy( name_q0 , argv[i] ) ;
  269.                 k = -1 ;
  270.             }
  271.         }
  272.  
  273.         if( k == 0 ) {
  274.             if( debug ) {
  275.                 pre_in();
  276.             }
  277.             else{
  278.                 printf( "ファイル名が指定されてません。" ) ;
  279.                 exit( -1 ) ;
  280.             }
  281.         }
  282.  
  283. /* パラメタの関連チェック */
  284.         pcheck() ;
  285.  
  286.     }
  287.  
  288. /* 対話入力 */
  289.     while( in_list() == 1 ) {
  290.         in_check() ;
  291.     }
  292.  
  293.  
  294. /* ファイル名の切りだし */
  295.     strcpy( name_fal , name_q0 ) ;
  296.     if( ( p1 = strrchr( name_fal , '.' ) ) != NULL ) {
  297.         if( strlen( p1 ) > 4  ) {
  298.             strcat( name_q0 , ".q0" ) ;
  299.             strcat( name_fal , ".fal" ) ;
  300.         }
  301.         strcpy( p1 , ".fal" ) ;
  302.     }
  303.     else {
  304.         strcat( name_q0 , ".q0" ) ;
  305.         strcat( name_fal , ".fal" ) ;
  306.     }
  307.  
  308. /*    領域の獲得    */
  309.     get_buff() ;
  310.  
  311. /* 各種パラメタの設定 */
  312.     parm_set() ;
  313.  
  314.     printf( "\nただいまより、読み込みを開始します。しばらくお待ち下さい。\n" ) ;
  315. /* 緑画面の読込 */
  316.     if( debug )
  317.         printf( "緑画面を読み込みます。\n" ) ;
  318.     read_plain( bg ) ;
  319.  
  320. /* 赤画面の読込 */
  321.     if( debug )
  322.         printf( "赤画面を読み込みます。\n" ) ;
  323.     read_plain( br ) ;
  324.  
  325. /* 青画面の読込 */
  326.     if( debug )
  327.         printf( "青画面を読み込みます。\n" ) ;
  328.     read_plain( bb ) ;
  329.     printf( "\n" ) ;
  330.     if( debug )
  331.         printf( "1画面を読み込みました。\n" ) ;
  332.  
  333. /* RS232C状態戻し */
  334.     modem_reset() ;
  335.  
  336. /* Q0ファイル作成処理 */
  337.     if( rotat ) {
  338.         rotation() ;
  339.     }
  340.     else {
  341.         make_q0() ;
  342.     }
  343.  
  344. /* FALファイル作成処理 */
  345.     if( fal ) {
  346.         if( debug )
  347.             printf( "FALファイルを作成します。\n" ) ;
  348.         fal_make() ;
  349.     }
  350.  
  351. /* 出来上がり (^^; */
  352.     printf( "\nお待たせしました、Q0ファイルが完成しました。\n" ) ;
  353.     exit( 0 ) ;
  354.  
  355. }
  356.  
  357. /* 対話入力処理 */
  358. void pre_in()
  359. {
  360.     copyright() ;
  361.     printf( "\n" ) ;
  362.     printf(
  363.         "ファイル プレフィックス             [ret:    quit] = " ) ;
  364.     strcpy( name_q0 ,"" ) ;
  365.     gets( name_q0 ) ;
  366.     if( name_q0[0] == NULL_ ) {
  367.         usage() ;
  368.         exit( -1 ) ;
  369.     }
  370.     in_check() ;
  371. }
  372.  
  373. /* 対話入力処理その2(^^; */
  374. void pre_in2()
  375. {
  376.     char indata[64] ;
  377.  
  378.     printf(
  379.         "ファイル プレフィックス             [ret:%8s] = ",
  380.         name_q0 ) ;
  381.     strcpy( indata ,"" ) ;
  382.     gets( indata ) ;
  383.     if( indata[0] != NULL_ ) {
  384.         strcpy( name_q0 , indata ) ;
  385.     }
  386. }
  387.  
  388. /* 対話入力チェック処理 */
  389. void in_check()
  390. {
  391.     int     i ;
  392.     char indata[64] ;
  393.  
  394. in_rx:
  395.     i = 0 ;
  396.     do{
  397.         i++ ;
  398.         if( i > 1 ) {
  399.             res_x = 100 ;
  400.         }
  401.         printf(
  402.             "主走査線方向の解像度 {50-200 S1}     [ret:%8d] = ",
  403.             res_x ) ;
  404.         strcpy( indata ,"" ) ;
  405.         gets( indata ) ;
  406.         if( indata[0] != NULL_ ) {
  407.             if( indata[0] == '-' ) {
  408.                 copyright() ;
  409.                 printf( "\n" ) ;
  410.                 pre_in2() ;
  411.                 goto in_rx ;
  412.             }
  413.             res_x = atoi( indata ) ;
  414.         }
  415.     } while( res_x > 200 || res_x < 50 ) ;
  416.  
  417. in_ry:
  418.     i = 0 ;
  419.     do{
  420.         i++ ;
  421.         if( i > 1 ) {
  422.             res_y = 100 ;
  423.         }
  424.         printf(
  425.             "副走査線方向の解像度 {50-200 S1}     [ret:%8d] = ",
  426.             res_y ) ;
  427.         strcpy( indata ,"" ) ;
  428.         gets( indata ) ;
  429.         if( indata[0] != NULL_ ) {
  430.             if( indata[0] == '-' ) {
  431.                 read_back() ;
  432.                 goto in_rx ;
  433.             }
  434.             res_y = atoi( indata ) ;
  435.         }
  436.     } while( res_y > 200 || res_y < 50 ) ;
  437.  
  438. in_zx:
  439.     i = 0 ;
  440.     do{
  441.         i++ ;
  442.         if( i > 1 ) {
  443.             zoom_x = 100 ;
  444.         }
  445.         printf(
  446.             "主走査線方向のズーム値 {50-200 S1}   [ret:%8d] = ",
  447.             zoom_x ) ;
  448.         strcpy( indata ,"" ) ;
  449.         gets( indata ) ;
  450.         if( indata[0] != NULL_ ) {
  451.             if( indata[0] == '-' ) {
  452.                 read_back() ;
  453.                 goto in_ry ;
  454.             }
  455.             zoom_x = atoi( indata ) ;
  456.         }
  457.     } while( zoom_x < 50 || zoom_x > 200 ) ;
  458.  
  459. in_zy:
  460.     i = 0 ;
  461.     do{
  462.         i++ ;
  463.         if( i > 1 ) {
  464.             zoom_y = 100 ;
  465.         }
  466.         printf(
  467.             "副走査線方向のズーム値 {50-200 S1}   [ret:%8d] = ",
  468.             zoom_y ) ;
  469.         strcpy( indata ,"" ) ;
  470.         gets( indata ) ;
  471.         if( indata[0] != NULL_ ) {
  472.             if( indata[0] == '-' ) {
  473.                 read_back() ;
  474.                 goto in_zx ;
  475.             }
  476.             zoom_y = atoi( indata ) ;
  477.         }
  478.     } while( zoom_y < 50 || zoom_y > 200 ) ;
  479.  
  480. in_sx:
  481.     i = 0 ;
  482.     do{
  483.         i++ ;
  484.         if( i > 1 ) {
  485.             start_x = 0 ;
  486.         }
  487.         printf(
  488.             "主走査線方向の始点座標 {0-1592}      [ret:%8d] = ",
  489.             start_x ) ;
  490.         strcpy( indata ,"" ) ;
  491.         gets( indata ) ;
  492.         if( indata[0] != NULL_ ) {
  493.             if( indata[0] == '-' ) {
  494.                 read_back() ;
  495.                 goto in_zy ;
  496.             }
  497.             start_x = atoi( indata ) ;
  498.         }
  499.     } while( start_x < 0  ||
  500.         start_x > 1592 ) ;
  501.  
  502. in_sy:
  503.     i = 0 ;
  504.     do{
  505.         i++ ;
  506.         if( i > 1 ) {
  507.             start_y = 0 ;
  508.         }
  509.         printf(
  510.             "副走査線方向の始点座標 {0-2559}      [ret:%8d] = ",
  511.             start_y ) ;
  512.         strcpy( indata ,"" ) ;
  513.         gets( indata ) ;
  514.         if( indata[0] != NULL_ ) {
  515.             if( indata[0] == '-' ) {
  516.                 read_back() ;
  517.                 goto in_sx ;
  518.             }
  519.             start_y = atoi( indata ) ;
  520.         }
  521.     } while( start_y < 0  ||
  522.         start_y > 2559 ) ;
  523.  
  524. in_lx:
  525.     i = 0 ;
  526.     do{
  527.         i++ ;
  528.         if( i > 1 ) {
  529.             length_x = 400 ;
  530.         }
  531.         printf(
  532.             "主走査線方向の読取長 {8-800}         [ret:%8d] = ",
  533.             length_x ) ;
  534.         strcpy( indata ,"" ) ;
  535.         gets( indata ) ;
  536.         if( indata[0] != NULL_ ) {
  537.             if( indata[0] == '-' ) {
  538.                 read_back() ;
  539.                 goto in_sy ;
  540.             }
  541.             length_x = atoi( indata ) ;
  542.         }
  543.     } while( length_x < 8       ||
  544.         length_x > 800      ||
  545.         length_x % 8 != 0 ||
  546.         pcheck_x() != 0 ) ;
  547.  
  548. in_ly:
  549.     i = 0 ;
  550.     do{
  551.         i++ ;
  552.         if( i > 1 ) {
  553.             length_y = 640 ;
  554.         }
  555.         printf(
  556.             "副走査線方向の読取長 {1-1280}        [ret:%8d] = ",
  557.             length_y ) ;
  558.         strcpy( indata ,"" ) ;
  559.         gets( indata ) ;
  560.         if( indata[0] != NULL_ ) {
  561.             if( indata[0] == '-' ) {
  562.                 read_back() ;
  563.                 goto in_lx ;
  564.             }
  565.             length_y = atoi( indata ) ;
  566.         }
  567.     } while( length_y < 1     ||
  568.         length_y > 1280 ||
  569.         pcheck_y() != 0 ) ;
  570.  
  571. in_b:
  572.     i = 0 ;
  573.     do{
  574.         i++ ;
  575.         if( i > 1 ) {
  576.             bright = 0 ;
  577.         }
  578.         printf(
  579.             "原稿の明度 {3-0/255-253}             [ret:%8d] = ",
  580.             bright ) ;
  581.         strcpy( indata ,"" ) ;
  582.         gets( indata ) ;
  583.         if( indata[0] != NULL_ ) {
  584.             if( indata[0] == '-' ) {
  585.                 read_back() ;
  586.                 goto in_ly ;
  587.             }
  588.             bright = atoi( indata ) ;
  589.         }
  590.     } while( bright < 0          ||
  591.         bright > 255     ||
  592.         ( bright > 3 && bright < 253 ) ) ;
  593.  
  594. in_g:
  595.     i = 0 ;
  596.     do{
  597.         i++ ;
  598.         if( i > 1 ) {
  599.             gamma = 1 ;
  600.         }
  601.         printf(
  602.             "原稿の濃度補正 {0/1/2/16/32}         [ret:%8d] = ",
  603.             gamma ) ;
  604.         strcpy( indata ,"" ) ;
  605.         gets( indata ) ;
  606.         if( indata[0] != NULL_ ) {
  607.             if( indata[0] == '-' ) {
  608.                 read_back() ;
  609.                 goto in_b ;
  610.             }
  611.             gamma = atoi( indata ) ;
  612.         }
  613.     } while( gamma != 0     &&
  614.         gamma != 1    &&
  615.         gamma != 2    &&
  616.         gamma != 16 &&
  617.         gamma != 32 ) ;
  618.  
  619. in_ro:
  620.     i = 0 ;
  621.     do{
  622.         i++ ;
  623.         if( i > 1 ) {
  624.             rotat = 0 ;
  625.         }
  626.         printf(
  627.             "画像の回転方向 {0:無/1:左/2:右/3:逆}  [ret:%8d] = ",
  628.             rotat ) ;
  629.         strcpy( indata ,"" ) ;
  630.         gets( indata ) ;
  631.         if( indata[0] != NULL_ ) {
  632.             if( indata[0] == '-' ) {
  633.                 read_back() ;
  634.                 goto in_g ;
  635.             }
  636.             rotat = atoi( indata ) ;
  637.         }
  638.     } while( rotat != 0     &&
  639.         rotat != 1    &&
  640.         rotat != 2    &&
  641.         rotat != 3 ) ;
  642.  
  643.     i = 0 ;
  644.     do{
  645.         i++ ;
  646.         if( i > 1 ) {
  647.             fal = 1 ;
  648.         }
  649.         printf(
  650.             "FALファイル作成 {1:スル/0:シナイ}       [ret:%8d] = ",
  651.             fal ) ;
  652.         strcpy( indata ,"" ) ;
  653.         gets( indata ) ;
  654.         if( indata[0] != NULL_ ) {
  655.             if( indata[0] == '-' ) {
  656.                 read_back() ;
  657.                 goto in_ro ;
  658.             }
  659.             fal = atoi( indata ) ;
  660.         }
  661.     } while( fal != 0  &&
  662.         fal != 1 ) ;
  663.  
  664. }
  665.  
  666. /* 入力確認処理 */
  667. int in_list()
  668. {
  669.     int i ;
  670.     char indata[64] ;
  671.  
  672.     i = 0 ;
  673.  
  674.     copyright() ;
  675.     printf( "\n" ) ;
  676.     printf( "  ファイル プレフィックス            =  %s\n",name_q0 ) ;
  677.     printf( "  主走査線方向の解像度                = %5d\n",res_x ) ;
  678.     printf( "  副走査線方向の解像度                = %5d\n",res_y ) ;
  679.     printf( "  主走査線方向のズーム値              = %5d\n",zoom_x ) ;
  680.     printf( "  副走査線方向のズーム値              = %5d\n",zoom_y ) ;
  681.     printf( "  主走査線方向の始点座標              = %5d\n",start_x ) ;
  682.     printf( "  副走査線方向の始点座標              = %5d\n",start_y ) ;
  683.     printf( "  主走査線方向の読取長                = %5d\n",length_x ) ;
  684.     printf( "  副走査線方向の読取長                = %5d\n",length_y ) ;
  685.     printf( "  原稿の明度                          = %5d\n",bright ) ;
  686.     printf( "  原稿の濃度補正                      = %5d\n",gamma ) ;
  687.     printf( "  画像の回転     {0:無/1:左/2:右/3:逆} = %5d\n",rotat ) ;
  688.     printf( "  FALファイルの作成    {1:スル/0:シナイ} = %5d\n",fal ) ;
  689.     printf("\n") ;
  690.     printf(
  691.         "以上の設定でよろしいですか {y:yes/n:no/q:quit}      [ret:   y] =" ) ;
  692.     strcpy( indata ,"" ) ;
  693.     gets( indata ) ;
  694.  
  695.     if( strcmp( indata , "n" )      == 0 ||
  696.             strcmp( indata , "N" )      == 0 ||
  697.             strcmp( indata , "no" )      == 0 ||
  698.             strcmp( indata , "NO" )      == 0 ) {
  699.         i = 1 ;
  700.         copyright() ;
  701.         printf( "\n" ) ;
  702.         pre_in2() ;
  703.     }
  704.  
  705.     if( strcmp( indata , "q" )      == 0 ||
  706.             strcmp( indata , "Q" )      == 0 ||
  707.             strcmp( indata , "quit" ) == 0 ||
  708.             strcmp( indata , "QUIT" ) == 0 ) exit( -1 ) ;
  709.  
  710.     return( i ) ;
  711. }
  712.  
  713. /* 一行戻し処理(^^; */
  714. void read_back()
  715. {
  716.     printf( "\x1b[1A\x1b[2K\x1b[1A\x1b[2K" ) ;
  717.  
  718. }
  719.  
  720. /* BIOSよよる初期化 */
  721. void rs232c_reset()
  722. {
  723.     union REGS in_reg,out_reg ;
  724.     struct SREGS sreg ;
  725.     unsigned char c ;
  726.     unsigned int seg_addr,off_addr ;
  727.  
  728. /* 念のためRS232CのBIOSセット */
  729.     if( nativetoreal( &(data_parm) , sizeof(data_parm) ,
  730.             &seg_addr , &off_addr ) < 0 ) {
  731.         printf ( "リアルメモリの獲得に失敗しました。1\n" ) ;
  732.         exit( -1 ) ;
  733.     }
  734.  
  735.     rs232c_parm.mode = 0x01                ;/* INT,non_flow,1bit,NONE,8bit */
  736.     rs232c_parm.rate = 0x05               ;/* 9600bps                        */
  737.     rs232c_parm.data_addr_o = off_addr    ;/* 受信データバッファアドレス    */
  738.     rs232c_parm.data_addr_s = seg_addr    ;/* 受信データバッファアドレス    */
  739.     rs232c_parm.send_timeout = 0        ;/* 送信タイムアウト時間  0.1秒 */
  740.     rs232c_parm.recive_timeout = 0        ;/* 受信タイムアウト時間  1秒    */
  741.     rs232c_parm.reserve0 = 0l            ;/* りざーぶ(^^;            */
  742.     rs232c_parm.reserve1 = 0            ;/* りざーぶ(^^;            */
  743.     rs232c_parm.reserve2 = 0            ;/* りざーぶ(^^;            */
  744.     rs232c_parm.reserve3 = 0            ;/* りざーぶ(^^;            */
  745.     data_parm.length = 2000             ;/* 受信バッファ長                */
  746.  
  747.     if( nativetoreal( &(rs232c_parm) , sizeof(rs232c_parm) ,
  748.             &seg_addr , &off_addr ) < 0 ) {
  749.         printf ( "リアルメモリの獲得に失敗しました。2\n" ) ;
  750.         exit( -1 ) ;
  751.     }
  752.  
  753.     in_reg.h.ah = 0x03 ;
  754.     in_reg.h.al = 0x00 ;
  755.     in_reg.x.di = off_addr ;
  756.     segread( &sreg ) ;
  757.     sreg.ds = seg_addr ;
  758.     intreal( 0x9b, &in_reg, &out_reg, &sreg ) ;
  759.     if( out_reg.h.ah ) {
  760.         printf( "通信パラメタの設定に失敗しました。%d\n" , out_reg.h.ah ) ;
  761.         exit( -1 ) ;
  762.     }
  763.  
  764.     segread( &sreg ) ;
  765.     in_reg.h.ah = 0x01 ;
  766.     in_reg.h.al = 0x00 ;
  767.     intreal( 0x9b, &in_reg, &out_reg, &sreg ) ;
  768.     if( out_reg.h.ah ) {
  769.         printf( "回線のオープンに失敗しました。%d\n" , out_reg.h.ah ) ;
  770.         exit( -1 ) ;
  771.     }
  772.  
  773.     segread( &sreg ) ;
  774.     in_reg.h.ah = 0x02 ;
  775.     in_reg.h.al = 0x00 ;
  776.     intreal( 0x9b, &in_reg, &out_reg, &sreg ) ;
  777.     if( out_reg.h.ah ) {
  778.         printf( "回線のクローズに失敗しました。%d\n" , out_reg.h.ah ) ;
  779.         exit( -1 ) ;
  780.     }
  781.  
  782. }
  783.  
  784. /* 通信パラメタのセット 08:9600 / 04:19200 bps */
  785. void rs232c_set( unsigned char speed )
  786. {
  787.  
  788.     RS_INIT() ;
  789.     OUTPB( 0x0056 , 0x76 ) ;
  790.     OUTPB( 0x0052 , speed ) ;
  791.     OUTPB( 0x0052 , 0x00 ) ;
  792.  
  793. }
  794.  
  795. /* 1バイト受信処理 */
  796. void rs232c_receive(unsigned char *c)
  797. {
  798.     int    data ;
  799.  
  800.     *c = RS_GETCH() ;
  801.     if( RS_STAT() & 0x00000038 ) {
  802.         printf( "受信処理に失敗しました。%.8X,%.8X\n" , data , *c ) ;
  803.         exit( -1 ) ;
  804.     }
  805.  
  806. }
  807.  
  808. /* 1バイト送信処理 */
  809. void rs232c_send(unsigned char c)
  810. {
  811.  
  812.     RS_PUTCH( c ) ;
  813.  
  814. }
  815.  
  816. /* パラメタの相関関係チェック */
  817. void pcheck()
  818. {
  819.     if( pcheck_x() ) {
  820.         printf( "主走査(X軸)方向のサイズが読取範囲を超えています。\n" ) ;
  821.         exit( -1 ) ;
  822.     }
  823.  
  824.     if( pcheck_y() ) {
  825.         printf( "副走査(Y軸)方向のサイズが読取範囲を超えています。\n" ) ;
  826.         exit( -1 ) ;
  827.     }
  828.  
  829. }
  830.  
  831. /* X軸の関係チェック */
  832. int pcheck_x()
  833. {
  834.     int m ;
  835.  
  836.     m = ( 25 * (int)res_x * (int)zoom_x / 25 ) / 25 ;
  837.     if( ( start_x + length_x ) > m ) return( -1 ) ;
  838.     else return( 0 ) ;
  839. }
  840.  
  841. /* Y軸の関係チェック */
  842. int pcheck_y()
  843. {
  844.     int m ;
  845.  
  846.     m = ( 16 * 25 * (int)res_y * (int)zoom_y / 25 ) / 250 ;
  847.     if( ( start_y + length_y ) > m ) return( -1 ) ;
  848.     else return( 0 ) ;
  849. }
  850.  
  851. /* 各種パラメタのセット */
  852. void parm_set()
  853. {
  854.  
  855.     unsigned char data , temp ;
  856.  
  857. /* ボーレート指定 */
  858.  
  859.     scan_init() ;
  860.     cmd[0] = ESC ;
  861.     cmd[1] = '$' ;
  862.     send( 2 ) ;
  863.  
  864.     cmd[0] = 'I' ;
  865.     cmd[1] = 0x00 ;    /* 19200bps */
  866.     send( 2 ) ;
  867.  
  868. /* データフォーマット指定 */
  869.     rs232c_set( 0x04 );
  870.     cmd[0] = ESC ;
  871.     cmd[1] = 'D' ;
  872.     send( 2 ) ;
  873.  
  874.     cmd[0] = 8 ;    /* 8ビット精度 */
  875.     send( 1 ) ;
  876.  
  877. /* 解像度指定 */
  878.     cmd[0] = ESC ;
  879.     cmd[1] = 'R' ;
  880.     send( 2 ) ;
  881.  
  882.     cmd[0] = res_x & 0xFF ;
  883.     cmd[1] = (res_x >> 8) & 0xFF ;
  884.     cmd[2] = res_y & 0xFF ;
  885.     cmd[3] = (res_y >> 8) & 0xFF ;
  886.     send( 4 ) ;
  887.  
  888. /* ズーム率指定 */
  889.     cmd[0] = ESC ;
  890.     cmd[1] = 'H' ;
  891.     send( 2 ) ;
  892.  
  893.     cmd[0] = zoom_x ;
  894.     cmd[1] = zoom_y ;
  895.     send( 2 ) ;
  896.  
  897. /* 読取領域指定 */
  898.     cmd[0] = ESC ;
  899.     cmd[1] = 'A' ;
  900.     send( 2 ) ;
  901.  
  902.     cmd[0] = start_x & 0xFF ;
  903.     cmd[1] = (start_x >> 8) & 0xFF ;
  904.     cmd[2] = start_y & 0xFF ;
  905.     cmd[3] = (start_y >> 8) & 0xFF ;
  906.     cmd[4] = length_x & 0xFF ;
  907.     cmd[5] = (length_x >> 8) & 0xFF ;
  908.     cmd[6] = length_y & 0xFF ;
  909.     cmd[7] = (length_y >> 8) & 0xFF ;
  910.     send( 8 ) ;
  911.  
  912. /* 色指定 */
  913.     cmd[0] = ESC ;
  914.     cmd[1] = 'C' ;
  915.     send( 2 ) ;
  916.  
  917.     cmd[0] = 1 ;    /* カラー読込指定 */
  918.     send( 1 ) ;
  919.  
  920. /* 明度指定 */
  921.     cmd[0] = ESC ;
  922.     cmd[1] = 'L' ;
  923.     send( 2 ) ;
  924.  
  925.     cmd[0] = bright ;
  926.     send( 1 ) ;
  927.  
  928. /* 濃度補正(γ補正)指定 */
  929.     cmd[0] = ESC ;
  930.     cmd[1] = 'Z' ;
  931.     send( 2 ) ;
  932.  
  933.     cmd[0] = gamma ;
  934.     send( 1 ) ;
  935.  
  936. /* 中間調処理指定 */
  937.     cmd[0] = ESC ;
  938.     cmd[1] = 'B' ;
  939.     send( 2 ) ;
  940.  
  941.     cmd[0] = 1 ;    /* 中間調処理を行わない */
  942.     send( 1 ) ;
  943.  
  944. /* 読取開始 */
  945.     rs232c_send( ESC ) ;
  946.     rs232c_send( 'G' ) ;
  947.     if( debug ) printf( "読み取り動作を開始します。\n" ) ;
  948.  
  949. }
  950.  
  951. /* コマンドの送信処理 */
  952. void send(int n)
  953. {
  954.     int i ;
  955.  
  956.     if( debug ) {
  957.         printf( "Send : " ) ;
  958.         for( i = 0 ; i < n ; i++ ) printf( "%.2X " ,  cmd[i] ) ;
  959.         printf( "\n" ) ;
  960.     }
  961.  
  962.     for( i = 0 ; i < n ; i++ ) {
  963.         rs232c_send( cmd[i] ) ;
  964.     }
  965.  
  966.     wait_ack() ;
  967.  
  968. }
  969.  
  970. /* ACK待ち処理 */
  971. void wait_ack()
  972. {
  973.     unsigned char data ;
  974.  
  975.     rs232c_receive( &data ) ;
  976.  
  977.     if( data != ACK ) {
  978.         printf( "否定応答を受信しました。%.2X\n" , data ) ;
  979.         exit( -1 ) ;
  980.     }
  981.     else {
  982.         if( debug ) printf( "Receive : ACK(%.2X).\n" , data ) ;
  983.     }
  984. }
  985.  
  986. /* FALファイルの作成 */
  987. void fal_make()
  988. {
  989.     FILE *fp ;
  990.     short i ;
  991.  
  992.     if( rotat > 0 && rotat < 3 ) {
  993.         i = length_x ;
  994.         length_x = length_y ;
  995.         length_y = i ;
  996.     }
  997.  
  998.     if( (fp=fopen( name_fal , "wt" )) == NULL ) {
  999.         printf( "ファイル(%s)がオープンできません。\n" , name_fal ) ;
  1000.         exit( -1 ) ;
  1001.     }
  1002.  
  1003.     fprintf( fp , "F_ALL(V1.00)\n" ) ;
  1004.     fprintf( fp , "%5d %5d     0     0\n",length_x,length_y ) ;
  1005.     fprintf( fp , "   1.00   255   255   255   0\n" ) ;
  1006.  
  1007.     fclose( fp ) ;
  1008.  
  1009. }
  1010.  
  1011. /* Q0ファイルの作成 */
  1012. void make_q0()
  1013. {
  1014.     int i,j,lx3 ;
  1015.     FILE *fp ;
  1016.     unsigned char *c,*r,*g,*b ;
  1017.  
  1018.     printf( "Q0ファイルを作成しています。\n" ) ;
  1019.  
  1020.     lx3 = length_x * 3 ;
  1021.  
  1022.     if( (fp=fopen( name_q0 , "wb" )) == NULL ) {
  1023.         printf( "ファイル(%s)がオープンできません。\n" , name_q0 ) ;
  1024.         exit( -1 ) ;
  1025.     }
  1026.  
  1027.     r = br ;
  1028.     g = bg ;
  1029.     b = bb ;
  1030.  
  1031.     for( i = 0 ; i < length_y ; i++ ) {
  1032.         c = buffer ;
  1033.         for( j = 0 ; j < length_x ; j++ ) {
  1034.             *c++ = *r++ ;
  1035.             *c++ = *g++ ;
  1036.             *c++ = *b++ ;
  1037.         }
  1038.         if( fwrite( buffer , 1 , lx3 , fp ) != lx3 ) {
  1039.             printf( "Q0ファイルの書き込みに失敗しました。\n" ) ;
  1040.             exit( -1 ) ;
  1041.         }
  1042.     }
  1043.  
  1044.     fclose( fp ) ;
  1045.  
  1046. }
  1047.  
  1048. /* 画像回転処理 */
  1049. void rotation()
  1050. {
  1051.     int     i,j,k,ly3,lx3 ;
  1052.     FILE *fp ;
  1053.     unsigned char *b0 ;
  1054.  
  1055.     if( (fp=fopen( name_q0 , "wb" )) == NULL ) {
  1056.         printf( "ファイル(%s)がオープンできません。\n" , name_q0 ) ;
  1057.         exit( -1 ) ;
  1058.     }
  1059.  
  1060.     ly3 = (int)length_y * 3 ;
  1061.     lx3 = (int)length_x * 3 ;
  1062.  
  1063. /* 左回転 */
  1064.     switch( rotat ) {
  1065.         case 1 :
  1066.             for( i = length_x - 1 , k = 1 ; i >= 0 ; i-- , k++ ) {
  1067.                 printf( "ただいま (%4u) LINEを回転中です。\r", k ) ;
  1068.                 b0 = buffer ;
  1069.                 for( j = 0 ; j < length_y ; j++ ) {
  1070.                     *b0++ = br[ i + j * (int)length_x ] ;
  1071.                     *b0++ = bg[ i + j * (int)length_x ] ;
  1072.                     *b0++ = bb[ i + j * (int)length_x ] ;
  1073.                 }
  1074.                 if( fwrite( buffer , 1 , ly3 , fp ) != ly3 ) {
  1075.                     printf( "Q0ファイルの書き込みに失敗しました。\n" ) ;
  1076.                     exit( -1 ) ;
  1077.                 }
  1078.             }
  1079.             break ;
  1080. /* 右回転 */
  1081.         case 2 :
  1082.              for( i = 0 ; i < length_x  ; i++ ) {
  1083.                 printf( "ただいま (%4u) LINEを回転中です。\r", i + 1 ) ;
  1084.                 b0 = buffer ;
  1085.                 for( j = length_y - 1 ; j >= 0 ; j-- ) {
  1086.                     *b0++ = br[ i + j * (int)length_x ] ;
  1087.                     *b0++ = bg[ i + j * (int)length_x ] ;
  1088.                     *b0++ = bb[ i + j * (int)length_x ] ;
  1089.                 }
  1090.                 if( fwrite( buffer , 1 , ly3 , fp ) != ly3 ) {
  1091.                     printf( "Q0ファイルの書き込みに失敗しました。\n" ) ;
  1092.                     exit( -1 ) ;
  1093.                 }
  1094.             }
  1095.             break ;
  1096. /* 逆回転 */
  1097.         case 3 :
  1098.             k = length_x * length_y ;
  1099.              for( i = 0 ; i < length_y  ; i++ ) {
  1100.                 printf( "ただいま (%4u) LINEを回転中です。\r", i + 1 ) ;
  1101.                 b0 = buffer ;
  1102.                 for( j = 0 ; j < length_x ; j++ ) {
  1103.                     k-- ;
  1104.                     *b0++ = br[ k ] ;
  1105.                     *b0++ = bg[ k ] ;
  1106.                     *b0++ = bb[ k ] ;
  1107.                 }
  1108.                 if( fwrite( buffer , 1 , lx3 , fp ) != lx3 ) {
  1109.                     printf( "Q0ファイルの書き込みに失敗しました。\n" ) ;
  1110.                     exit( -1 ) ;
  1111.                 }
  1112.             }
  1113.             break ;
  1114.     }
  1115.     printf( "\n" ) ;
  1116.     fclose( fp ) ;
  1117.  
  1118. }
  1119.  
  1120. /* バッファ獲得 */
  1121. void get_buff()
  1122. {
  1123.     if( ( ( br       = malloc( length_x * length_y ) ) == NULL ) ||
  1124.         ( ( bg       = malloc( length_x * length_y ) ) == NULL ) ||
  1125.         ( ( bb       = malloc( length_x * length_y ) ) == NULL ) ||
  1126.         ( ( buffer = malloc( max_( (int)length_x * 3 , (int)length_y * 3 ) ) ) == NULL ) ) {
  1127.         printf("\n  作業用に必要なメモリが不足しています。\n") ;
  1128.         exit( -1 ) ;
  1129.     }
  1130. }
  1131.  
  1132. /* バッファ解放 */
  1133. void free_buff()
  1134. {
  1135.     free( br ) ;
  1136.     free( bg ) ;
  1137.     free( bb ) ;
  1138.     free( buffer ) ;
  1139. }
  1140.  
  1141. /* 1プレーン読込 */
  1142. void read_plain(unsigned char *bx)
  1143. {
  1144.     int i,j ;
  1145.     unsigned char data , temp , head ;
  1146.     int int_data_org ;
  1147.  
  1148.     cur_off() ;
  1149.     int_read() ;
  1150.     int_data_org = int_data ;
  1151.     int_data &= 0x00000000 ;
  1152.     int_set() ;
  1153.     int_data = int_data_org ;
  1154.  
  1155.     j = 0 ; 
  1156.     for(;;){
  1157.  
  1158. /* STX待ち */
  1159.         temp = RS_GETCH() ;
  1160.         if( RS_STAT() & 0x00000038 ) {
  1161.             int_set() ;
  1162.             cur_on() ;
  1163.             modem_reset() ;
  1164.             printf( "STX(%d):受信処理に失敗しました。%.8X,%.8x\n",j,data,temp);
  1165.             exit( -1 ) ;
  1166.         }
  1167.  
  1168. /* ステータス読込 */
  1169.         head = RS_GETCH() ;
  1170.         if( RS_STAT() & 0x00000038 ) {
  1171.             int_set() ;
  1172.             cur_on() ;
  1173.             modem_reset() ;
  1174.             printf( "STA(%d):受信処理に失敗しました。%.8X,%.8x\n",j,data,temp);
  1175.             exit( -1 ) ;
  1176.         }
  1177.  
  1178. /* データ長読込 */
  1179.         temp = RS_GETCH() ;
  1180.         if( RS_STAT() & 0x00000038 ) {
  1181.             int_set() ;
  1182.             cur_on() ;
  1183.             modem_reset() ;
  1184.             printf( "LN1(%d):受信処理に失敗しました。%.8X,%.8x\n",j,data,temp);
  1185.             exit( -1 ) ;
  1186.         }
  1187.         temp = RS_GETCH() ;
  1188.         if( RS_STAT() & 0x00000038 ) {
  1189.             int_set() ;
  1190.             cur_on() ;
  1191.             modem_reset() ;
  1192.             printf( "LN2(%d):受信処理に失敗しました。%.8X,%.8x\n",j,data,temp);
  1193.             exit( -1 ) ;
  1194.         }
  1195.  
  1196. /* 画像データ読込 */
  1197.         for( i = 0 ; i < length_x ; i++ ) {
  1198.             *bx++ = RS_GETCH() ;
  1199.             if( RS_STAT() & 0x00000038 ) {
  1200.                 int_set() ;
  1201.                 cur_on() ;
  1202.                 modem_reset() ;
  1203.                 printf( "X=%d,Y=%d:受信処理に失敗しました。%.8X\n",i,j,data ) ;
  1204.                 exit( -1 ) ;
  1205.             }
  1206.         }
  1207.         j++ ;
  1208.         if( ( head & 0x20) > 0 ) break ;
  1209.         if( j > length_y ) break ;
  1210.         rs232c_send( ACK ) ;
  1211.     }
  1212.  
  1213.     int_set() ;
  1214.     cur_on() ;
  1215.  
  1216.     if( !( head & 0x20 ) && ( j > length_y ) )
  1217.         printf( "副走査線方向の読み取りで、内部矛盾が発生しました。\n" ) ;
  1218.  
  1219.     if(     ( head & 0x20 ) && ( j != length_y ) )
  1220.         printf( "副走査線方向の読み取りで、内部矛盾が発生しました。\n" ) ;
  1221.  
  1222.     if( debug )
  1223.         printf( "1画面を読み込みました。\n" ) ;
  1224.  
  1225. }
  1226.  
  1227. /* 大きい方を返す(^^; */
  1228. int max_(int a,int b)
  1229. {
  1230.     if( a > b ) return( a ) ;
  1231.     else return( b ) ;
  1232. }
  1233.  
  1234. /* イニシャライズ */
  1235. void scan_init()
  1236. {
  1237.     int    data , i ;
  1238.  
  1239.     modem_set() ;
  1240.     rs232c_reset() ;
  1241.     rs232c_set( 0x08 ) ;    /* 9600 */
  1242.     rs232c_send( ESC ) ;
  1243.     rs232c_send( '@' ) ;
  1244.     data = RS_GETCH() ;
  1245.     if( RS_STAT() & 0x00000038 ) {
  1246.         if( debug )
  1247.             printf( "ボーレートは19200で設定されています。%.8X,%.8X\n"
  1248.             ,RS_STAT(),data ) ;
  1249.         for( i = 0 ; i < 5000 ; i++ ) printf("\r") ; /* WAIT */
  1250.         rs232c_set( 0x04 ) ;    /* 19200 */
  1251.         rs232c_send( ESC ) ;
  1252.         rs232c_send( '@' ) ;
  1253.         data = RS_GETCH() ;
  1254.         if( RS_STAT() & 0x00000038 ) {
  1255.             if( debug )
  1256.                 printf( "ボーレートがよくわからない(;_;)。   %.8X,%.8X\n"
  1257.                 ,RS_STAT(),data ) ;
  1258.         }
  1259.         rs232c_set( 0x08 ) ; /* 9600 */
  1260.     }
  1261.     else {
  1262.         if( debug ) printf( "ボーレートは9600で設定されています。\n" ) ;
  1263.     }
  1264.  
  1265.     for( i = 0 ; i < 5000 ; i++ ) printf("\r") ; /* WAIT */
  1266.  
  1267. }
  1268.  
  1269. /* CAN送信 */
  1270. void cancel()
  1271. {
  1272.     if( debug ) printf( "Send CAN. \n" ) ;
  1273.     rs232c_send( CAN ) ;
  1274.     wait_ack() ;
  1275. }
  1276.  
  1277. /* 割り込み許可情報の読みだし */
  1278. void int_read()
  1279. {
  1280.     union REGS in_reg,out_reg ;
  1281.     struct SREGS sreg ;
  1282.     unsigned int seg_addr,off_addr ;
  1283.  
  1284.     if( nativetoreal( &(int_data) , sizeof(int_data) ,
  1285.             &seg_addr , &off_addr ) < 0 ) {
  1286.         printf ( "リアルメモリの獲得に失敗しました。1\n" ) ;
  1287.         exit( -1 ) ;
  1288.     }
  1289.  
  1290.     in_reg.h.ah = 0x03 ;
  1291.     in_reg.x.di = off_addr ;
  1292.     segread( &sreg ) ;
  1293.     sreg.ds = seg_addr ;
  1294.     intreal( 0xae, &in_reg, &out_reg, &sreg ) ;
  1295.  
  1296.     if( debug ) printf( "割り込み情報は(%.8X)\n" , int_data ) ;
  1297.  
  1298. }
  1299.  
  1300. /* 割り込み許可情報の書き込み */
  1301. void int_set()
  1302. {
  1303.     union REGS in_reg,out_reg ;
  1304.     struct SREGS sreg ;
  1305.     unsigned int seg_addr,off_addr ;
  1306.  
  1307.     if( nativetoreal( &(int_data) , sizeof(int_data) ,
  1308.             &seg_addr , &off_addr ) < 0 ) {
  1309.         printf ( "リアルメモリの獲得に失敗しました。1\n" ) ;
  1310.         exit( -1 ) ;
  1311.     }
  1312.  
  1313.     if( debug ) printf( "割り込み情報は(%.8X)\n" , int_data ) ;
  1314.     printf( "                                                           \r" ) ;
  1315.  
  1316.     in_reg.h.ah = 0x02 ;
  1317.     in_reg.x.di = off_addr ;
  1318.     segread( &sreg ) ;
  1319.     sreg.ds = seg_addr ;
  1320.     intreal( 0xae, &in_reg, &out_reg, &sreg ) ;
  1321.  
  1322. }
  1323.  
  1324. /* カーソル非表示 */
  1325. void cur_off()
  1326. {
  1327.     putchar( 0x1b ) ;
  1328.     putchar( '['  ) ;
  1329.     putchar( '1'  ) ;
  1330.     putchar( 'v'  ) ;
  1331. }
  1332.  
  1333. /* カーソル表示 */
  1334. void cur_on()
  1335. {
  1336.     putchar( 0x1b ) ;
  1337.     putchar( '['  ) ;
  1338.     putchar( '0'  ) ;
  1339.     putchar( 'v'  ) ;
  1340. }
  1341.  
  1342. /* 外部RS232C選択 */
  1343. void modem_set()
  1344. {
  1345.     modem_select = INPB( 0x0a0a ) & 0xc0 ;
  1346.     OUTPB( 0x0a0a , 0x80 ) ;
  1347. }
  1348.  
  1349. /* RS232C選択の状態を戻す */
  1350. void modem_reset()
  1351. {
  1352.     OUTPB( 0x0a0a , modem_select ) ;
  1353. }
  1354.  
  1355. /* 著作権表示 */
  1356. void copyright()
  1357. {
  1358.     printf( "\x1b*" ) ;
  1359.     printf(
  1360.         "FMSC-201G -> Q0 Driver  Ver 0.12 , Copyright (c) E.Suto ,1992-1993\n"
  1361.         );
  1362. }
  1363.  
  1364. /* 使い方 */
  1365. void usage()
  1366. {
  1367.     printf( "\n 使用法 : FS201Q0 [options] [file-path-prefix]\n\n" ) ;
  1368.     printf( " options: オプション = 機能概略 [選択値] (省略値)\n" ) ;
  1369.     printf(
  1370.         "   -rx数字 = 主走査線方向の解像度      [50-200 step 1]       (100)\n" ) ;
  1371.     printf(
  1372.         "   -ry数字 = 副走査線方向の解像度      [50-200 step 1]       (100)\n" ) ;
  1373.     printf(
  1374.         "   -zx数字 = 主走査線方向のズーム値    [50-200 step 1]       (100)\n" ) ;
  1375.     printf(
  1376.         "   -zy数字 = 副走査線方向のズーム値    [50-200 step 1]       (100)\n" ) ;
  1377.     printf(
  1378.         "   -sx数字 = 主走査線方向の読み取り始点[0-1592 step 1]       (  0)\n" ) ;
  1379.     printf(
  1380.         "   -sy数字 = 副走査線方向の読み取り始点[0-2559 step 1]       (  0)\n" ) ;
  1381.     printf(
  1382.         "   -lx数字 = 主走査線方向の読み取り長さ[8-800  step 8]       (400)\n" ) ;
  1383.     printf(
  1384.         "   -ly数字 = 副走査線方向の読み取り長さ[1-1280 step 1]       (640)\n" ) ;
  1385.     printf(
  1386.         "   -b数字  = 明度指定                  [3-0/255-253]         (  0)\n" ) ;
  1387.     printf(
  1388.         "   -g数字  = 濃度補正                  [0/1/2/16/32]         (  1)\n" ) ;
  1389.     printf(
  1390.         "   -ro数字 = 回転方向                  [0:無/1:左/2:右/3:逆] (  0)\n" ) ;
  1391.     printf(
  1392.         "   -f数字 = FALファイル作成の有無 [0:無/1:有]           (  1)\n" ) ;
  1393.     printf(
  1394.         "   -h    = HELP(本メッセージ表示)          \n" ) ;
  1395. }
  1396.  
  1397.